/**
 * 空调遥控
 *
 * 题目描述
 * dd作为集训队的队长，一直掌管着集训室的空调遥控器，她需要调整温度使队员们更好地进入训练状态，已知集训室一共有
 * n名队员，每位队员都有一个温度诉求a[i](1≤i≤n)，当室内温度为
 * K时，当且仅当∣a[i]−K∣≤p时，这个队员能够正常进入训练状态，否则就会开始躁动，作为队长，
 * dd需要调整好温度，她想知道，在最佳情况下，最多有多少队员同时进入训练状态
 *
 * 输入描述:
 * 第一行两个数n,p(1≤n,p≤1000000),含义如题面描述
 * 接下来一行n个数a[i](1≤a[i]≤1000000)表示每个队员的温度诉求
 *
 * 输出描述:
 * 输出一个数字，表示最多有多少队员同时进入训练状态
 */

import java.util.Arrays;
import java.util.Scanner;

/**
 * 这一题我们是可以枚举所有可能出现的温度, 然后再对每一个
 * 人进行判断, 是否可以正常发挥, 然后就会求出一些满足条件
 * 的人, 但是枚举出来一看, 这些人的温度好像是在这个附近跳
 * 动的, 那么我们就可以先将数组排好序, 在进行枚举, 排好序
 * 我们又可以发现, 好像有多少人和温度没有关系了哎, 只要这些
 * 人的最大温差在一个范围里, 那么这里的人就是都可以满足正常
 * 发挥的... 排好序, 范围, 那不就是可以使用 滑动窗口了嘛,
 * 那这个范围也就是 2 * p, 因为是有 绝对值的...
 * 时间复杂度 : O(nlog(n))
 * 空间复杂度 : O(1)
 */

public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int n = in.nextInt(), p = in.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = in.nextInt();
        }

        // 将数组进行排序
        Arrays.sort(nums);

        // 这个是条件
        p *= 2;

        // 定义边界, 和最大人数
        int left = 0, right = 0, res = 0;

        // 滑动窗口
        while (right < n) {

            // 没有不满足条件直接就是入窗口

            // 不满足条件是处窗口, 及得要是 while,
            // 因为出一个数可能还会不满足条件
            while (nums[right] - nums[left] > p) {
                left++;
            }

            // 既然在 while 后面肯定是 满足条件的了, 更新最大值
            res = Math.max(res, right - left + 1);

            // 边界++
            right++;
        }

        // 返回结果
        System.out.println(res);
    }
}